<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"/>
<title>事件监听</title><link href="../zdoc.css" rel="stylesheet" type="text/css"/><link href="../_rs/site.css" rel="stylesheet" type="text/css"/><script src="../_rs/jquery.js" language="Javascript"></script><script src="../_rs/site.js" language="Javascript"></script><script src="../_rs/z.js" language="Javascript"></script>
</head>
<body><a name="top"></a>
<div class="zdoc_header">事件监听</div>
<div class="zdoc_author"><em>By:</em><b>zozoh</b><a href="mailto:zozohtnt@gmail.com">&lt;zozohtnt@gmail.com&gt;</a></div>
<div class="zdoc_body">
<ul class="zdoc_index_table">
<li>
<div><span class="num">1</span><a href="#都有哪些事件">都有哪些事件</a></div>
</li>
<li>
<div class="zdoc_folder"><span class="num">2</span><a href="#怎么监听">怎么监听</a></div>
<ul>
<li>
<div><span class="num">2.1</span><a href="#通过实现一个触发器">通过实现一个触发器</a></div>
</li>
<li>
<div><span class="num">2.2</span><a href="#通过对象自身的一个函数">通过对象自身的一个函数</a></div>
</li>
</ul>
</li>
<li>
<div><span class="num">3</span><a href="#监听其他事件">监听其他事件</a></div>
</li>
</ul>
<p></p>
<div class="hr"><b></b></div>
<h1><a name="都有哪些事件"></a>都有哪些事件</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p>Nutz.Ioc 容器有三种事件：</p>
<ul type="disc">
<li>对象被创建</li>
<li>对象被从容器中取出</li>
<li>对象被销毁</li>
</ul>
<p>在这三种时刻，你如果想做一些特殊的操作，比如，当一个数据源被销毁时，你希望能够关闭所有的连接，你可以在 JSON 配置文件中，声明一下，你想监听什么事件，以及怎么监听。</p>
<p><span style="color:#FF0000;"><b> 注:</b></span> 如果你的对象是 "singleton: false"，那么容器创建了对象后就会立即忘记它的存在。因为鬼才知道你打算创建多少份该对象的实例，要是每份实例都记录的话，内存说不定爆了。所以这样的非单例对象，你在 depose 容器的时候，容器是不会调用它的 depose 方法的，即使你在配置文件中声明了它，因为容器根本就不会知道这样的对象曾经存在过。但是 create, fetch 事件还是会被调用到的。</p>
<div class="hr"><b></b></div>
<h1><a name="怎么监听"></a>怎么监听</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p>我们为 Pet 对象增加一个新的属性:</p>
<pre>public class Pet {

	private int fetchCount;
	
	... // 省略其他属性以及 getter 和 setter
</pre>
<h2><a name="通过实现一个触发器"></a>通过实现一个触发器</h2>
<div style="float:right;"><a href="#top">Top</a></div>
<h3><a name="触发器"></a>触发器</h3>
<div style="float:right;"><a href="#top">Top</a></div>
<pre>package nutz.demo.ioc.book;//提醒: 不要把你的类放在缺省包中!!

import org.nutz.ioc.IocEventTrigger;

public class OnFetchPet implements IocEventTrigger&lt;Pet&gt; {

	public void trigger(Pet pet) {
		pet.setFetchCount(pet.getFetchCount() + 1);
	}

}
</pre>
<p>IocEventTrigger 接口只有一个方法，当它被调用的时候，就表示某个事件发生了。具体什么事件呢？完全看你在 JSON 配置文件中把这个触发器，声明在哪种事件下面</p>
<h3><a name="在_JSON_配置文件中声明监听的事件"></a>在 JSON 配置文件中声明监听的事件</h3>
<div style="float:right;"><a href="#top">Top</a></div>
<pre>var ioc = {
	xb : {
		events : {
			fetch : 'nutz.demo.ioc.book.OnFetchPet'
		},
		fields : {
			name : 'XiaoBai'
		}
	}
}
</pre>
<p></p>
<h3><a name="调用代码"></a>调用代码</h3>
<div style="float:right;"><a href="#top">Top</a></div>
<pre>Ioc ioc = new NutIoc(new JsonLoader("nutz/demo/ioc/book/events.js"));
Pet pet = ioc.get(Pet.class, "xb");
ioc.get(Pet.class, "xb");
ioc.get(Pet.class, "xb");
System.out.printf("%s be fetch %d times", pet.getName(), pet.getFetchCount());
</pre>
<h3><a name="控制台输出"></a>控制台输出</h3>
<div style="float:right;"><a href="#top">Top</a></div>
<pre>XiaoBai be fetch 3 times
</pre>
<p></p>
<h2><a name="通过对象自身的一个函数"></a>通过对象自身的一个函数</h2>
<div style="float:right;"><a href="#top">Top</a></div>
<p>这个函数必须为  public，并且不能有参数</p>
<h3><a name="为_Pet_对象增加一个函数："></a>为 Pet 对象增加一个函数：</h3>
<div style="float:right;"><a href="#top">Top</a></div>
<pre>public void onFetch() {
	this.fetchCount++;
}
</pre>
<p></p>
<h3><a name="在_JSON_配置文件中增加新的对象"></a>在 JSON 配置文件中增加新的对象</h3>
<div style="float:right;"><a href="#top">Top</a></div>
<pre>xh : {
	events : {
		fetch : 'onFetch'
	},
	fields : {
		name : 'XiaoHei'
	}
}
</pre>
<h3><a name="调用代码"></a>调用代码</h3>
<div style="float:right;"><a href="#top">Top</a></div>
<pre>Pet xh = ioc.get(Pet.class, "xh");
ioc.get(Pet.class, "xh");
System.out.printf("%s be fetch %d times\n", xh.getName(), xh.getFetchCount());
</pre>
<h3><a name="控制台输出"></a>控制台输出</h3>
<div style="float:right;"><a href="#top">Top</a></div>
<pre>XiaoHei be fetch 2 times
</pre>
<div class="hr"><b></b></div>
<h1><a name="监听其他事件"></a>监听其他事件</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<pre>events : {
	fetch  : ... ,
	create : ... ,
	depose : ...
}
</pre>
<p>根据需要，你可以选择上述三个事件，为其声明触发器，或者触发函数。</p>
</div>
<div class="zdoc_footer"><em>By:</em><b>zozoh</b><a href="mailto:zozohtnt@gmail.com">&lt;zozohtnt@gmail.com&gt;</a></div>
</body>
</html>